package com.google.code.cana.pojo.venda;

import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import com.google.code.cana.pojo.financeiro.ItemExtrato;
import com.google.code.cana.pojo.financeiro.Pagamento;
import com.google.code.cana.pojo.pessoas.Cliente;
import com.google.code.cana.pojo.pessoas.Usuario;



public class Venda implements Serializable, ItemExtrato {

	private static final long serialVersionUID = -7632980511445275568L;

	private Integer vendaId;

	private Set<ItemVenda> itensVenda = new TreeSet<ItemVenda>();

	private Date dataCadastro;

	private Date dataVenda;
	
	private Usuario usuario;
	
	private Cliente cliente;
	
	private boolean doacao = false;
	
	private Double valorDevido = 0.0;
	
	private List<Pagamento> pagamentos = new LinkedList<Pagamento>();
	
	private boolean finalizada = false;
	
	/**
	 * @return the finalizada
	 */
	public boolean isFinalizada() {
		return finalizada;
	}

	/**
	 * @param finalizada the finalizada to set
	 */
	public void setFinalizada(boolean finalizada) {
		this.finalizada = finalizada;
	}

	/**
	 * @return the cliente
	 */
	public Cliente getCliente() {
		return cliente;
	}

	/**
	 * @param cliente the cliente to set
	 */
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	/**
	 * @return the usuario
	 */
	public Usuario getUsuario() {
		return usuario;
	}

	/**
	 * @param usuario the usuario to set
	 */
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	/**
	 * Recupera o valor total da venda.
	 * 
	 * @return O valor total da venda.
	 */
	public Double getValorTotal() {
		Double total = 0.0;
		for (Iterator<ItemVenda> iteradorItens = itensVenda.iterator(); iteradorItens.hasNext();) {
			ItemVenda itemVenda = iteradorItens.next();
			total += itemVenda.getSubtotal();
		}
		return total;
	}

	/**
	 * 
	 * @return teh itensVenda
	 */
	public Set<ItemVenda> getItensVenda() {
		return itensVenda;
	}

	/**
	 * @param itensCompra
	 *            the itensCompra to set
	 */
	public void setItensVenda(Set<ItemVenda> itensVenda) {
		this.itensVenda = itensVenda;
	}

	/**
	 * @return the dataCadastro
	 */
	public Date getDataCadastro() {
		return dataCadastro;
	}

	/**
	 * @param dataCadastro
	 *            the dataCadastro to set
	 */
	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	/**
	 * @return the dataVenda
	 */
	public Date getDataVenda() {
		return dataVenda;
	}

	/**
	 * @param dataVenda
	 *            the dataVenda to set
	 */
	public void setDataVenda(Date dataVenda) {
		this.dataVenda = dataVenda;
	}

	/**
	 * @return the vendaId
	 */
	public Integer getVendaId() {
		return vendaId;
	}

	/**
	 * @param vendaId
	 *            the vendaId to set
	 */
	public void setVendaId(Integer vendaId) {
		this.vendaId = vendaId;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + ((vendaId == null) ? 0 : vendaId.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Venda other = (Venda) obj;
		if (vendaId == null) {
			if (other.vendaId != null)
				return false;
		} else if (!vendaId.equals(other.vendaId))
			return false;
		return true;
	}

	/**
	 * @return the pagamentos
	 */
	public List<Pagamento> getPagamentos() {
		return pagamentos;
	}

	/**
	 * @param pagamentos the pagamentos to set
	 */
	public void setPagamentos(List<Pagamento> pagamentos) {
		this.pagamentos = pagamentos;
	}

	/**
	 * @return the doacao
	 */
	public boolean isDoacao() {
		return doacao;
	}

	/**
	 * @param doacao the doacao to set
	 */
	public void setDoacao(boolean doacao) {
		this.doacao = doacao;
	}

	/**
	 * @return the valorDevido
	 */
	public Double getValorDevido() {
		return valorDevido;
	}

	/**
	 * @param valorDevido the valorDevido to set
	 */
	public void setValorDevido(Double valorDevido) {
		this.valorDevido = valorDevido;
	}
	
	/**
	 * Retorna o valor paga
	 * @return
	 */
	public Double getValorPago() {
		Double total = 0.0;
		
		for (Iterator iter = pagamentos.iterator(); iter.hasNext();) {
			Pagamento pagamento = (Pagamento) iter.next();
			total += pagamento.getValorPago();
		}
		
		return total;
	}

	/* (non-Javadoc)
	 * @see com.google.code.cana.pojo.financeiro.ItemExtrato#getDataRegistro()
	 */
	public Date getDataRegistro() {
		return getDataVenda();
	}

	/* (non-Javadoc)
	 * @see com.google.code.cana.pojo.financeiro.ItemExtrato#getDescricaoItem()
	 */
	public String getDescricaoItem() {
		return "Venda para o cliente " + getCliente().getNome();
	}

	/* (non-Javadoc)
	 * @see com.google.code.cana.pojo.financeiro.ItemExtrato#getObservacao()
	 */
	public String getObservacao() {
		return null;
	}

	/* (non-Javadoc)
	 * @see com.google.code.cana.pojo.financeiro.ItemExtrato#getValorMovimentacao()
	 */
	public Double getValorMovimentacao() {
		return getValorDevido();
	}
}
